﻿using System;
using Castle.MonoRail.Framework;
using System.Collections.Generic;
using NHibernate.Mapping;
using System.Linq;
using System.Web;
using CoopSaude.Dto;
using CoopSaude.DAO;
using CoopSaude.ServiceReceita;

namespace CoopSaude.Controllers
{
    [ControllerDetails(Area = "Prontuario")]
    [DefaultAction("Index")]
    public class ReceitaController : BaseController
    {
        #region Actions
        public void Index()
        {
            this.MenuUtilizado = "prontuario";
            this.SecaoUtilizada = "receita";

            List<MedicoDTO> medicos;
            string paciente = Params["paciente"];
            if (paciente != null && !String.IsNullOrEmpty(paciente))
            {
                PropertyBag["listaPacientes"] = PacienteDto.BuscarPorNome(paciente);
            }
            else
                PropertyBag["listaPacientes"] = PacienteDto.BuscarPorNome("");
            if (Session["listaMedicos"] == null)
            {
                medicos = MedicoDTO.ListarMedicos();
                Session["listaMedicos"] = medicos;
            }
            else
            {
                medicos = (List<MedicoDTO>)Session["listaMedicos"];
            }
            PropertyBag["listaMedicos"] = medicos;
        }


        public void Buscar()
        {
            try
            {
                string nomePaciente = Params["nome_paciente"];
                List<PacienteDto> lsPacientes;

                string paciente = Params["paciente"];
                if (paciente != null && !String.IsNullOrEmpty(paciente))
                {
                    lsPacientes = PacienteDto.BuscarPorNome(paciente);
                    PropertyBag["pacientes"] = lsPacientes;
                    Session["listaPacientes"] = lsPacientes;
                }
                else
                {
                    lsPacientes = PacienteDto.BuscarPorNome("");
                    PropertyBag["pacientes"] = lsPacientes;
                    Session["listaPacientes"] = lsPacientes;

                }
                List<MedicoDTO> medicos = MedicoDTO.ListarMedicos();
                PropertyBag["medicos"] = medicos;
                Session["listaMedicos"] = medicos;

            }
            catch (Exception e)
            {
                Flash["erro"] = "Ocorreu um erro ao acessar o serviço";
            }
            this.MenuUtilizado = "prontuario";
            this.SecaoUtilizada = "receita";
            this.AcaoUtilizada = "buscar";
        }

        public void Listar()
        {

            string idPaciente = Params["paciente_sel"];
            string idMedico = Params["medico_sel"];

            List<ReceitaDTO> receitas;
            List<PacienteDto> listaPaciente = (List<PacienteDto>)Session["listaPacientes"];
            List<MedicoDTO> listaMedico = (List<MedicoDTO>)Session["listaMedicos"];
            try
            {
                receitas = ReceitaDTO.ListarReceitas(idMedico, idPaciente);
                PropertyBag["receitas"] = receitas;
                PropertyBag["paciente"] = listaPaciente.Find(x => x.Id == int.Parse(idPaciente));
                PropertyBag["medico"] = listaMedico.Find(x => x.Id == int.Parse(idMedico)); ;
                Session["receitas"] = receitas;
            }
            catch (Exception)
            {
                Flash["error"] = "Ocorreu um erro ao acessar o serviço";
            }

        }

        public void Exibir()
        {
            List<ReceitaDTO> receitas = (List<ReceitaDTO>)Session["receitas"];
            int idReceita = Int32.Parse(Params["idReceita"]);
            List<PacienteDto> listaPaciente = (List<PacienteDto>)Session["listaPacientes"];
            List<MedicoDTO> listaMedico = (List<MedicoDTO>)Session["listaMedicos"];
            ReceitaDTO receita = receitas.Find(x => x.Id == idReceita);

            PropertyBag["paciente"] = listaPaciente.Find(x => x.Id == int.Parse(receita.IdPaciente));
            PropertyBag["medico"] = listaMedico.Find(x=> x.Id == int.Parse(receita.IdMedico));
            PropertyBag["receita"] = receita;

        }

        public void Adicionar()
        {
            this.MenuUtilizado = "prontuario";
            this.SecaoUtilizada = "receita";
            this.AcaoUtilizada = "adicionar";

            List<MedicoDTO> medicos;
            string paciente = Params["paciente"];
            if (paciente != null && !String.IsNullOrEmpty(paciente))
            {
                PropertyBag["listaPacientes"] = PacienteDto.BuscarPorNome(paciente);
                Session["listaPacientes"] = PacienteDto.BuscarPorNome(paciente);
            }
            else
            {
                PropertyBag["listaPacientes"] = PacienteDto.BuscarPorNome("");
                Session["listaPacientes"] = PacienteDto.BuscarPorNome("");
            }
            if (Session["listaMedicos"] == null)
            {
                medicos = MedicoDTO.ListarMedicos();
                Session["listaMedicos"] = medicos;
            }
            else
            {
                medicos = (List<MedicoDTO>)Session["listaMedicos"];
            }
            PropertyBag["listaMedicos"] = medicos;
        }

        public void Criar()
        {
            this.MenuUtilizado = "prontuario";
            this.SecaoUtilizada = "receita";
            this.AcaoUtilizada = "adicionar";

            try
            {

                string idMedico = Params["medico_nome"];
                string idPaciente = Params["paciente_nome"];
                string descricao = Params["receita_descricao"].ToString().Trim();

                List<PacienteDto> listaPaciente = (List<PacienteDto>)Session["listaPacientes"];
                List<MedicoDTO> listaMedico = (List<MedicoDTO>)Session["listaMedicos"];
                ReceitaDTO receita = ReceitaDTO.CriarReceita(idMedico, idPaciente, descricao);

                PropertyBag["paciente"] = listaPaciente.Find(x => x.Id == int.Parse(receita.IdPaciente));
                PropertyBag["medico"] = listaMedico.Find(x => x.Id == int.Parse(receita.IdMedico));
                PropertyBag["receita"] = receita;
                RenderView("exibir");

            }
            catch (Exception ex)
            {
                Flash["erro"] = "Ocorreu um erro ao salvar a receita no banco de dados.";
                RedirectToAction("buscar");
            }
        }

        public void Iniciar()
        {
            this.MenuUtilizado = "prontuario";
            this.SecaoUtilizada = "receita";

            string idMedico = Params["medico_nome"];
            string idPaciente = Params["paciente_nome"];

            Session["idPaciente"] = idPaciente;
            Session["idMedico"] = idMedico;

            bool check = RHFinanceiroDAO.notificarInicioAtendimentoMedico(Convert.ToInt32(idMedico), idPaciente);
            
            RedirectToAction("adicionar");

        }

        public void Finalizar()
        {
            string paciente = (string)Session["idPaciente"];
            int medico =  Convert.ToInt32(Session["idMedico"]);

            bool check = RHFinanceiroDAO.notificarFimAtendimentoMedico(medico, paciente);

            if (check)
            {
                RedirectToAction("buscar");
            }
            else
                Flash["erro"] = "Ocorreu um erro ao tentar finalizar consulta.";
            RedirectToAction("index");
        }

        #endregion

    }
}